package model.action.basic_function_action;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;

import model.dap.dao.ConsumerDAO;
import model.dap.domain.Consumer;
import model.dap.mapper.ConsumerMapper;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ModelDriven;
import common.base.BaseAction;
import common.util.ValidateUtil;

@Results({
		@Result(name = "ChangepasswordLoad", type = "tiles", location = "tiles.Changepassword"),
		@Result(name = "error", type = "tiles", location = "tiles.Changepassword"),
		@Result(name = "success", type = "tiles", location = "tiles.Changepassword"),
		@Result(name = "successEx", type = "redirectAction", location = "tiles.Changepassword"),
		@Result(name = "successCx", type = "redirectAction", location = "getConsumerId.html"),
})
@ParentPackage("master_login")
public class ChangePasswordAction extends BaseAction implements
		ModelDriven<Consumer> {
	protected static Logger log = Logger.getLogger(ChangePasswordAction.class);
	private static final long serialVersionUID = 1L;
	private String userID;
	private Consumer consumer = new Consumer();
	// ======================================================================================================
	// GET, SET PROPERTY

	public Consumer getConsumer() {
		return consumer;
	}

	public void setConsumer(Consumer consumer) {
		this.consumer = consumer;
	}

	public String getUserID() {
		userID = ServletActionContext.getRequest().getParameter("userID");
		return userID;
	}

	public void setUserID(String userID) {
		this.userID = userID;
	}

	// ======================================================================================================
	// LOAD CHANGE PASSWORD FORM
	@Action("/master/change-password")
	public String Changepassword() {
		getCityList2();
		loadParentDealCategory();
		return "ChangepasswordLoad";
	}

	// ======================================================================================================
	// GET CONSUMER BY ID
	@Action("/master/getConsumerId")
	public String getConsumerbyId() {
		try {
			loadParentDealCategory();
			getCityList2();
			ConsumerMapper consumermapper = new ConsumerDAO();
			consumer = consumermapper.getConsumerbyId(getCurrentUser().getUserID());
			return SUCCESS;
		} catch (Exception e) {
			return ERROR;
		}
	}

	// ======================================================================================================
	// UPDATE PASSWORD
	private String password, confirmNewPassword, newPassword;
	@Action("/master/update-password")
	public String updatePassword() {
		try {
			String type = ServletActionContext.getRequest().getMethod();
			
			if(type.toUpperCase() == "GET")
			{
				return "successCx";
			}
			
			loadParentDealCategory();
			getCityList2();
			consumer.setUserID(getCurrentUser().getUserID());
			password = consumer.getPassWord();
			newPassword = consumer.getNewPassword();
			confirmNewPassword = consumer.getConfirmNewPassword();
			
			try {
				if (ValidateUtil.validateEmptyString(password) == false &&
					ValidateUtil.validateEmptyString(newPassword) == false &&
					ValidateUtil.validateEmptyString(confirmNewPassword) == false) 
				{
					consumer.setPassWord(ValidateUtil.MD5Encryption(password));
					consumer.setNewPassword(ValidateUtil.MD5Encryption(newPassword));
					consumer.setConfirmNewPassword(ValidateUtil.MD5Encryption(confirmNewPassword));
				}
			}

			catch (NoSuchAlgorithmException a) {
				a.printStackTrace();
			}

			catch (UnsupportedEncodingException a) {
				a.printStackTrace();
			}

			if (validateInputField() == false) {
				return ERROR;
			}
			ConsumerMapper consumerMapper = new ConsumerDAO();
			Consumer consumerResult = consumerMapper.getConsumerbyId(getCurrentUser().getUserID());
			int cons = consumerMapper.updatePassword(consumer);
			if (cons == 0) {
				showError("Lỗi trong quá trình cập nhật mật khẩu. Vui lòng thử lại");
				return ERROR;
			}
			if(consumerResult == null){
				showError("Lỗi trong quá trình hiển thị lại thông tin tài khoản. Vui lòng đăng xuất và thử lại");
				return ERROR;
			}
			// REFRESH SESSION
			delCurrentUser();
			consumer.setUserID(consumerResult.getUserID());
			consumer.setPassWord(consumer.getNewPassword());
			consumer.setFullName(consumerResult.getFullName());
			setCurrentUser(consumerResult);
			setSuccessmessage(getText("Thay đổi mật khẩu thành công"));
			return SUCCESS;
		} catch (Exception e) {
			// TODO: handle exception
			log.error(e.getMessage());
			showError("Lỗi trong quá trình cập nhật mật khẩu. Vui lòng thử lại");
			return ERROR;
		}
	}

	// ======================================================================================================
	// VALIDATE INPUT FIELD
	public boolean validateInputField() {
		boolean check = true;

		// ===============XAC NHAN MAT KHAU CU CO KHOP VOI TEN TAI KHOAN HAY KHONG===============
		if (ValidateUtil.validateOldPassword(consumer) == false) {
			showError(getText("Mật khẩu hiện tại không đúng! vui lòng xem lại"));
			check = false;
		}

		if (ValidateUtil.validateEmptyString(password) == true) {
			showError(getText("Mật khẩu cũ không được để trống"));
			check = false;
		}
		if (ValidateUtil.validateEmptyString(newPassword) == true) {
			showError(getText("Mật khẩu mới không được để trống"));
			check = false;
		}
		if (ValidateUtil.validateLengthOfPassword(password) == false) {
			showError(getText("Chiều dài mật khẩu cũ không hợp lệ - mật khẩu phải từ 6-50"));
			check = false;
		}

		if (ValidateUtil.validateLengthOfPassword(newPassword) == false) {
			showError(getText("Chiều dài mật khẩu mới không hợp lệ - mật khẩu phải từ 6-50"));
			check = false;
		}

		if (ValidateUtil.validateLengthOfPassword(confirmNewPassword) == false) {
			showError(getText("Chiều dài mật khẩu xác nhận không hợp lệ - mật khẩu phải từ 6-50"));
			check = false;
		}

		if (ValidateUtil.validateConfirmPassword(newPassword,
				confirmNewPassword) == false) {
			showError(getText("Mật khẩu xác nhận không trùng với mật khẩu mới"));
			check = false;
		}
		return check;
	}

	// ======================================================================================================
	// GET MODEL FOR CONSUMER
	@Override
	public Consumer getModel() {
		// TODO Auto-generated method stub
		return consumer;
	}

}
